<?php

/**
 * Класс для всяких разных функций-утилит.
 *
 */

class __lib_utils {
	/***********************************************************************************
	Функция img_resize(): генерация thumbnails
	Параметры:
	  $src             - имя исходного файла
	  $dest            - имя генерируемого файла
	  $width, $height  - ширина и высота генерируемого изображения, в пикселях
	Необязательные параметры:
	  $rgb             - цвет фона, по умолчанию - белый
	  $quality         - качество генерируемого JPEG, по умолчанию - максимальное (100)
	***********************************************************************************/
	function img_resize($src, $dest, $width, $height, $realsize=false, $rgb=0xFFFFFF, $quality=100) {
	  if (!file_exists($src)) return false;
	
	  $size = getimagesize($src);
	
	  if ($size === false) return false;
	
	  // Определяем исходный формат по MIME-информации, предоставленной
	  // функцией getimagesize, и выбираем соответствующую формату
	  // imagecreatefrom-функцию.
	  $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
	  $icfunc = "imagecreatefrom" . $format;
	  if (!function_exists($icfunc)) return false;
	
	  $x_ratio = $width / $size[0];
	  $y_ratio = $height / $size[1];
	
	  $ratio       = min($x_ratio, $y_ratio);
	  $use_x_ratio = ($x_ratio == $ratio);
	
	  $new_width   = $use_x_ratio  ? $width  : floor($size[0] * $ratio);
	  $new_height  = !$use_x_ratio ? $height : floor($size[1] * $ratio);
	  
	  if($realsize === true) {
	  		$width  = $new_width;
			$height = $new_height;
	  }
	  
	  $new_left    = $use_x_ratio  ? 0 : floor(($width - $new_width) / 2);
	  $new_top     = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
	
	  $isrc = $icfunc($src);
	  $idest = imagecreatetruecolor($width, $height);
	
	  imagefill($idest, 0, 0, $rgb);
	  imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, 
		$new_width, $new_height, $size[0], $size[1]);
	
	  imagejpeg($idest, $dest, $quality);
	
	  imagedestroy($isrc);
	  imagedestroy($idest);
	
	  return true;
	
	}

	//Upload файлов на сервер
 	 // $url - серверный путь куда будет сохранен файл
	 // $input_field_name - название поля <input>
	 // $max_file_size - максимальный размер картинки в килобайтах
	 // $valid_types - массив, перечень допустимых разрешений
	
	/*. Описание ошибок
		 
	 1 - файл пуст
	 2 - файл больше указанного размера
	 3 - разрешение файла отсутсвует в массиве $valid_tipes
	 4 - ошибка при копировании временного файла в папку назначения ($url)
	 5 - в указанном поле ( $input_field_name ) непередавался файл
	 
	*/
	
	function upload($url,$input_field_name="file",$max_file_size="1024",$valid_types=array("gif","jpg", "png", "jpeg")) {
		
		$max_file_size = $max_file_size*1024;		// переводим в байты
		
		if (isset($_FILES[$input_field_name])) {
			if (is_uploaded_file($_FILES[$input_field_name]['tmp_name'])) {
				$filename = $_FILES[$input_field_name]['tmp_name'];
				$ext = substr($_FILES[$input_field_name]['name'], 
					1 + strrpos($_FILES[$input_field_name]['name'], "."));
/*				if (filesize($filename) > $max_file_size) {
					return"2";
				} else*/if (!in_array(strtolower($ext), $valid_types)) {
					return"3";
					//return false;
				} else {
					$filename = md5($_FILES[$input_field_name]['name'].$_SESSION['time']).$_FILES[$input_field_name]['name'];
					
					$filename=$_SESSION['user']['login'];
					
					if (@move_uploaded_file($_FILES[$input_field_name]['tmp_name'],$url."/".$filename)) {
					    @chmod($url."/".$filename, 0777);
						return $filename;
					} else {
						return"4";
						//return false;
					}
				}
			} else {
				return "1";
				//return false;
			}
		} else {
			return"5";
			//return false;
		}
	}
	
    function parseImages($text,$link_to_image){
        return preg_replace("/(\\<img\\s+[^\\>]*)src\\=(?:\\\"|\\')((?:[^\\>\\\"]*\\/)?)([^\\>\\\"]*?)(?:\\\"|\\')([^\\>]*\\>)/is","\\1src=\"$link_to_image/\\3\"\\4",$text);
    }
	
    //перевод числа месяца в слово на рус.
	static function MonthToWord($month){
		$month_words = array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря");
		return $month_words[intval($month)-1];
	}
    
    /**
     * Проверка правильности урла и преобразовывает его в нормальный вид.
     * При неправильном урле генерирует Exception
     *
     * @param string $url
     * @return string
     */
    static function checkUrl($url){
	    //проверяем URL на правильность
	    if (!preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32}".
	       ")?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|".
    	    "name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.".
	       ",_@%&?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i", $url, $ok)) {

			return false;
	       //throw new Exception(_('Incorrect url').': '.$url, 158);
        }

	    // если нет протокала - добавить
	    if (!strstr($url, "://")) {
	        $url = "http://".$url;
	    }

	    // заменить протокол на нижний регистр: hTtP -> http
	    $url = preg_replace("~^[a-z]+~ie", "strtolower('\\0')", $url);

	    return $url;
	}
	
	/**
	 * выделяет из урла домен
	 *
	 * @param string $url
	 * @return string
	 */
	static function getDomainFromUrl($url) {
	    if ($s=strstr($url,"://")) {
	       $url=substr($s,3);
	    }
	    if ($i=strpos($url,'/')) {
	       $url=substr($url,0,$i);
	    }
	    return $url;
	}
	
	function amountFormat($amount,$perscision=2)
    {
        str_replace(',','.', $amount);
        $amount=round($amount, $perscision);
        str_replace(',','.', $amount);
        list($r, $c)=explode('.', $amount, 2);
        if(strlen($r)<1) $r='0';
        while(strlen($c)<$perscision) $c.='0';
        return $r.'.'.$c;
    }
    
    function dateFormat($sql_date, $time=false, $seconds=false) {
        $ax=explode(" ",$sql_date);
        $bx=explode("-",$ax[0]);
        $cx=explode(":",$ax[1]);
        return $bx[2].".".$bx[1].".".$bx[0].(($time)?(" ".$cx[0].":".$cx[1].(($seconds)? (":".$cx[2]) : "")):"");
    }
    
    function dateBankToSQL($date){
        if (empty($date)) return date("Y-m-d H:i:s");
        $ax=explode(" ",$date);
        $bx=explode("/",$ax[0]);
        return $bx[2]."-".$bx[1]."-".$bx[0]." ".$ax[1];
    }
    
    /**
     * Формирует XML 
     *
     * @param array $data - массив 
     * @return string XML
     */
    function XMLMaker($data,$encoding='utf-8') {
        $xml = new DOMDocument('1.0', $encoding);
        foreach ($data as $name => $value) {
            $xml->appendChild(Utils::XMLMakeLevel($xml,"$name",$value));
        }
        $res=$xml->saveXML();
        return $res;
    }
    function XMLMakeLevel($xml,$levelName,$levelData) {
        $level=$xml->createElement($levelName,"");
        foreach ($levelData as $name => $value) {
            if (!is_array($value)) {
                $item=$xml->createElement($name,$value);
                $level->appendChild($item);
            }
            else {
                $level->appendChild(Utils::XMLMakeLevel($xml,$name,$value));
            }
        }
        return $level;
    }
    
    /**
     * разбирает пришедший XML и сохраняет его в массив
     *
     * @param String $data XML
     * @return array 
     */
    function XMLParser($data) {
        $doc = new DOMDocument();
        $doc->loadXML($data);
        $doc->preserveWhiteSpace = false;
        $pNode = $doc->documentElement;
        $answer[$pNode->localName]=Utils::XMLParseLevel($pNode);
        return $answer;
    }
    function XMLParseLevel($level) {
        $result=array();
        $tmp=array();
       // if (is_array($level->childNodes))
        foreach ($level->childNodes as $node) {
            if ($node->localName!=null) {
                $tmp[$node->localName]=Utils::XMLParseLevel($node);
            }
        }
        $attr=array();
      //  if (is_array($level->attributes))
        foreach ($level->attributes as $attribute) {
            $attr[$attribute->localName]=$attribute->nodeValue;
        }
        if (count($tmp)>0) {
            $result["child"]=$tmp;
        }
        else {
            $result["value"]=$level->nodeValue;
        }
        if (count($attr)>0) {
            $result["attributes"]=$attr;
        }
        return $result;
    }
    
     /**
     * разбирает пришедший XML и сохраняет его в массив, 
     * где child может быть несколько с одинаковыми именами.
     * @param String $data XML
     * @return array 
     */
    function XMLParserMulti($data) {
        $doc = new DOMDocument();
        $doc->loadXML($data);
        $doc->preserveWhiteSpace = false;
        $pNode = $doc->documentElement;
        $answer[$pNode->localName]=Utils::XMLParseLevelMulti($pNode);
        return $answer;
    }
    function XMLParseLevelMulti($level) {
        $result=array();
        $tmp=array();
     //   if (is_array($level->childNodes))
        foreach ($level->childNodes as $node) {
            if ($node->localName!=null) {
                $tmp[$node->localName][]=Utils::XMLParseLevelMulti($node);
            }
        }
        $attr=array();
    //    if (is_array($level->attributes))
        foreach ($level->attributes as $attribute) {
            $attr[$attribute->localName]=$attribute->nodeValue;
        }
        if (count($tmp)>0) {
            $result["child"]=$tmp;
        }
        else {
            $result["value"]=$level->nodeValue;
        }
        if (count($attr)>0) {
            $result["attributes"]=$attr;
        }
        return $result;
    }
    
    /**
     * Формирует строку пост запроса
     *
     * @param array $data
     * @return string
     */
    function POSTMaker($data) {
        $string="";
        if (is_array($data)) {
            foreach ($data as $n => $v) {
                $string.="$n=".urlencode($v)."&";
            }
        }
        return substr($string,0,strlen($string)-1);
    }
    
    /**
     * определяет есть-ли в массиве элементы не массивы
     *
     * @param array $arr
     * @return bool
     */
    function array_is_plain($arr) {
        if (!is_array($arr)) {return true;}
        foreach ($arr as $v) {
            if (!is_array($v)) {return true;}
        }
        return false;
    }
    
    /**
     * рекурсивно объединяет два массива, 
     * если элемент второго массива не простой массив (все его элемены массивы) 
     * и в первом массиве есть элемент с таким ключем, 
     * то выполняется рекурсия для этих двух элементов
     *
     * @param array $arr1
     * @param array $arr2
     * @return array
     */
    function array_merge_recursive($arr1,$arr2) {
        $result=is_array($arr1)?$arr1:array();
        foreach ($arr2 as $k=>$v) {
            if (__lib_utils::array_is_plain($v) || !array_key_exists($k,$arr1)) {
                $result[$k]=$v;
            }
            else {
                $result[$k]=__lib_utils::array_merge_recursive($arr1[$k],$v);
            }
        }
        
        return $result;
    }
    
    /**
     * Выдает текст. Если текст длинее указанного параметра, то добавляет '...'
     * 
     */
 function previewStr($_str, $_length = 200, $_before = 0){
  $result = '';
  require_once('safe.php');
  $html_parse=new __lib_safe();
  
  $_str=strip_tags($html_parse->parse($_str));    
  
  if (strlen($_str) > $_length){

   if ($_before == 1 && $_length > 4)
    $_length -= 4;

   $result = substr($_str, 0, $_length);

   if ($_before == 1)
    $result = substr($result, 0, strrpos($result, ' ') - $_length);
   else{
    $tmp = substr($_str, $_length);
    $result .= substr($tmp, 0, strpos($tmp, ' '));
   }
 
   if (in_array(substr($result, -1, 1), array(',', '.', '-', ':', ';', '!', '?', '(')))
    $result = substr($result, 0, -1);
    
   $result .= ' ...';
  }else 
   $result = $_str;
   
  $result = str_replace("'", "&lsquo;", $result);
/*
  $result = str_replace("&quot;", "'", $result);
  $result = str_replace("&quot", "'", $result);
  $result = str_replace("&lt;", "<", $result);
  $result = str_replace("&gt;", ">", $result);
  $result = implode("<br />", explode("\n",$result));	// str_replace чета не пашит :)
  */
  return $result;
 }
 
 /**
	 * проверяет правильность мыла
	 *
	 * @param string $email
	 * @return bool
	 */
	static function checkEMail($email) {
	    return ereg("[-_a-zA-Z0-9.]+@[-_a-zA-Z0-9.]+\.[a-zA-Z]{2,4}",$email);
	}
	
	/**
	 * Определяет IP-адрес пользователя.
	 *
	 * @return string
	 */
	public function getIp()
    {

        // Get some server/environment variables values
        if (empty($REMOTE_ADDR)) {
            if (!empty($_SERVER) && isset($_SERVER['REMOTE_ADDR'])) {
                $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
            }elseif (!empty($_ENV) && isset($_ENV['REMOTE_ADDR'])) {
                $REMOTE_ADDR = $_ENV['REMOTE_ADDR'];
            }elseif (@getenv('REMOTE_ADDR')) {
                $REMOTE_ADDR = getenv('REMOTE_ADDR');
            }
        } // end if

        if (empty($HTTP_X_FORWARDED_FOR)) {
            if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];
            }elseif (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED_FOR'])) {
                $HTTP_X_FORWARDED_FOR = $_ENV['HTTP_X_FORWARDED_FOR'];
            }elseif (@getenv('HTTP_X_FORWARDED_FOR')) {
                $HTTP_X_FORWARDED_FOR = getenv('HTTP_X_FORWARDED_FOR');
            }
        } // end if

        if (empty($HTTP_X_FORWARDED)) {
            if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED'])) {
                $HTTP_X_FORWARDED = $_SERVER['HTTP_X_FORWARDED'];
            }elseif (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED'])) {
                $HTTP_X_FORWARDED = $_ENV['HTTP_X_FORWARDED'];
            }elseif (@getenv('HTTP_X_FORWARDED')) {
                $HTTP_X_FORWARDED = getenv('HTTP_X_FORWARDED');
            }
        } // end if

        if (empty($HTTP_FORWARDED_FOR)) {
            if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED_FOR'])) {
                $HTTP_FORWARDED_FOR = $_SERVER['HTTP_FORWARDED_FOR'];
            }elseif (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED_FOR'])) {
                $HTTP_FORWARDED_FOR = $_ENV['HTTP_FORWARDED_FOR'];
            }elseif (@getenv('HTTP_FORWARDED_FOR')) {
                $HTTP_FORWARDED_FOR = getenv('HTTP_FORWARDED_FOR');
            }
        } // end if

        if (empty($HTTP_FORWARDED)) {
            if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED'])) {
                $HTTP_FORWARDED = $_SERVER['HTTP_FORWARDED'];
            }elseif (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED'])) {
                $HTTP_FORWARDED = $_ENV['HTTP_FORWARDED'];
            }elseif (@getenv('HTTP_FORWARDED')) {
                $HTTP_FORWARDED = getenv('HTTP_FORWARDED');
            }
        } // end if

        if (empty($HTTP_VIA)) {
            if (!empty($_SERVER) && isset($_SERVER['HTTP_VIA'])) {
                $HTTP_VIA = $_SERVER['HTTP_VIA'];
            }elseif (!empty($_ENV) && isset($_ENV['HTTP_VIA'])) {
                $HTTP_VIA = $_ENV['HTTP_VIA'];
            }elseif (@getenv('HTTP_VIA')) {
                $HTTP_VIA = getenv('HTTP_VIA');
            }
        } // end if

        if (empty($HTTP_X_COMING_FROM)) {
            if (!empty($_SERVER) && isset($_SERVER['HTTP_X_COMING_FROM'])) {
                $HTTP_X_COMING_FROM = $_SERVER['HTTP_X_COMING_FROM'];
            }elseif (!empty($_ENV) && isset($_ENV['HTTP_X_COMING_FROM'])) {
                $HTTP_X_COMING_FROM = $_ENV['HTTP_X_COMING_FROM'];
            }elseif (@getenv('HTTP_X_COMING_FROM')) {
                $HTTP_X_COMING_FROM = getenv('HTTP_X_COMING_FROM');
            }
        } // end if

        if (empty($HTTP_COMING_FROM)) {
            if (!empty($_SERVER) && isset($_SERVER['HTTP_COMING_FROM'])) {
                $HTTP_COMING_FROM = $_SERVER['HTTP_COMING_FROM'];
            }elseif (!empty($_ENV) && isset($_ENV['HTTP_COMING_FROM'])) {
                $HTTP_COMING_FROM = $_ENV['HTTP_COMING_FROM'];
            }elseif (@getenv('HTTP_COMING_FROM')) {
                $HTTP_COMING_FROM = getenv('HTTP_COMING_FROM');
            }
        } // end if

        // Gets the default ip sent by the user
        if (!empty($REMOTE_ADDR))
        $direct_ip = $REMOTE_ADDR;

        // Gets the proxy ip sent by the user
        $proxy_ip  = '';
        if (!empty($HTTP_X_FORWARDED_FOR)) {
            $proxy_ip = $HTTP_X_FORWARDED_FOR;
        }elseif (!empty($HTTP_X_FORWARDED)) {
            $proxy_ip = $HTTP_X_FORWARDED;
        }elseif (!empty($HTTP_FORWARDED_FOR)) {
            $proxy_ip = $HTTP_FORWARDED_FOR;
        }elseif (!empty($HTTP_FORWARDED)) {
            $proxy_ip = $HTTP_FORWARDED;
        }elseif (!empty($HTTP_VIA)) {
            $proxy_ip = $HTTP_VIA;
        }elseif (!empty($HTTP_X_COMING_FROM)) {
            $proxy_ip = $HTTP_X_COMING_FROM;
        }elseif (!empty($HTTP_COMING_FROM)) {
            $proxy_ip = $HTTP_COMING_FROM;
        } // end if... else if...

        // Returns the true IP if it has been found, else FALSE
        if (empty($proxy_ip)) {
            // True IP without proxy
            return $direct_ip;
        }else{
            $is_ip = ereg('^([0-9]{1,3}\.){3,3}[0-9]{1,3}', $proxy_ip, $regs);
            if ($is_ip && (count($regs) > 0)) {
                // True IP behind a proxy
                return $regs[0];
            }else{
                // Can't define IP: there is a proxy but we don't have
                // information about the true IP
                return FALSE;
            }
        } // end if... else...
    }
    
    function checkTel($tel){
        return (!preg_match("/^\\+[0-9]{1,3}[0-9]{2,4}[0-9]{5,7}$/",$tel))? false : true;
    }
    
    function passwordCheck($password){
        if (strlen($password)<6) return false;
        $symbols="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#\$%^&*()_-=+[]\{\}\\|:;\"'<>,.?/";
        $pass_array=str_split($password);
        foreach ($pass_array as $v){
            if (strpos($symbols, $v)===false){
                return false;
            }
        }
        return true;
    }
	
    function checkLogin($password){
        if(strlen($password)<3) return false;
        $symbols="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМТИЬБЮйцукенгшщзхъфывапролджэячсмитьбюЁё.";
        $pass_array=str_split($password);
        foreach ($pass_array as $v){
            if (strpos($symbols, $v)===false){
                return $v;
            }
        }
        return true;
    }
}

?>
